Vue.js v-for at list
array
Vue 的循环就是通过 v-for
指令得以实现,通常可以通过循环的方式来渲染一个列表对象。同样 v-for
指令还需使用 item in items
形式的特殊语法进行渲染:
通常 item 是被迭代数组的别名,而 items 则是数组的元数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <ui id="app"> <li v-for="item in items">{{item.message}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { items: [ {message: 'This is one'}, {message: 'This is two'} ] } } }) const vm = app.mount('#app') </script>
|
父作用域属性
在 v-for
指令中,我们所有可以访问的父作用域属还支持可选的第二参数,主要用于索引和加入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <ui id="app"> <li v-for="(item, index) in items">{{index}}-{{item.message}}——{{message}}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { message: 'Hey,v-for', items: [ {message: 'This is one'}, {message: 'This is two'} ] } } }) const vm = app.mount('#app') </script>
|
Object
除数组以外,v-for
指令同样支持对象的循环渲染以及父作用域属性的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <ui id="app"> <li v-for="item in items">{{item}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { items: { title: 'Start Vue 3.0', author: 'lk.sun' } } } }) const vm = app.mount('#app') </script>
|
父作用域
需要注意的是父作用域中的第二参数的格式和位置需要按照 value、name、index
的形式进行排序,否则在数据渲染的时候将会出现混乱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <ui id="app"> <li v-for="(value, name, index) in items">index: {{index}} - name: {{name}} - value: {{value}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { items: { title: 'Start Vue 3.0', author: 'lk.sun' } } } }) const vm = app.mount('#app') </script>
|
维护状态
当 v-for
渲染的元素列表发生改变时,会默认使用 就地更新 测罗,如果数据被改变 vue 将不会移动 DOM 元素来匹配数据项的顺序,为了确保他们每个需渲染后索引位置正确,在节点中加入一个唯一的 key
属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <ui id="app"> <li v-for="item in items" :key="item.id">{{item}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { items: { title: 'Start Vue 3.0', author: 'lk.sun' } } } }) const vm = app.mount('#app') </script>
|
在官方文档中建议我们尽可能的时候 v-for
时可以提供 key
属性,除非遍历输出的 DOM 内容非常简单,或是希望可以减少性能上的提升。
数组的更新检测
变更方法
Id |
Name |
Info |
1 |
push() |
增加一个方法 |
2 |
pop() |
从下往上突然的删除一个方法 |
3 |
shift() |
从上往下删除一个方法 |
4 |
unshift() |
从上方新加入一个方法 |
5 |
splice() |
splice() 方法可用于添加、删除、替换数组内的值 |
6 |
sort() |
用于排序方法 |
7 |
reverse() |
主要用于排序倒序 |
8 |
filter() |
过滤器或筛选 |
9 |
slice() |
切片 |
假设我们需要增加一个新的数组,可以通过使用 push()
变更方法在控制台中直接使用 vm.items.push({message: 'A4TECH'})
进行加入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <ui id="app"> <li v-for="item in items">{{item.message}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { items: [ {message: 'LG'} ] } } }) const vm = app.mount('#app') </script>
|
过滤和排序
filter()
在 Vue 3.0 中,将 filters
属性移除并向变更方法中新增了一个 filter()
方法作为过滤器进行使用,在 Vue 2.x 中,开发者可以使用 filters
来处理通用的文本格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <template> <h1>Bank Account Balance</h1> <p>{{ accountBalance | currencyUSD }}</p> </template>
<script> export default { props: { accountBalance: { type: Number, required: true } }, filters: { currencyUSD(value) { return '$' + value } } } </script>
|
在 Vue 3.x 中可以通过使用 fliter()
来处理数组来进行过滤:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <ui id="app"> <li v-for="item in evenNumbers" :key="item">{{item}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { numbers: [1, 2, 3, 4, 5, 6] } }, computed: { evenNumbers() { return this.numbers.filter(number => number % 2 === 0) } } }) const vm = app.mount('#app') </script>
|
sort()
除了 filter()
可以通过表达式进行过滤,还可以通过 sort
来对数组进行排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <ui id="app"> <li v-for="item in evenNumbers" :key="item">{{item}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { numbers: [1, 20, 2, 3, 4, 100] } }, computed: { evenNumbers() { return this.numbers.sort(sortNumbers) } } }) function sortNumbers(a,b){ return a-b; } const vm = app.mount('#app') </script>
|
slice().reverse()
Vue 不仅提供了一个排序的 sort()
方法,还提供了 reverse()
方法来进行逆转,但这需要 slice()
切片后重新进行排序:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <ui id="app"> <li v-for="item in numbers.slice().reverse()" :key="item">{{item}}</li> </ui> <script> const app = Vue.createApp ({ data() { return { numbers: [1, 2, 3, 4, 5] } } }) const vm = app.mount('#app') </script>
|
template at value
template 是一个字符串模板,用于组件的实例标记,木板将会替换所挂载元素的源 HTML,挂在的任何元素所有标记都会被忽略,因此通常可以使用 template 作为指令块进行使用,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <ui id="app"> <template v-for="item in 10" :key="item"> <li>{{item}}</li> </template> </ui> <script> const app = Vue.createApp ({ data() { return { } } }) const vm = app.mount('#app') </script>
|
这将会被渲染为以下 HTML 表达式:
1 2 3 4
| <ul> <li>...</li> ... </ul>
|
⬅️ Go back